package com.example.wanbaqian.utils;

import java.lang.reflect.Type;
import java.util.ArrayList;

import org.json.JSONException;
import org.json.JSONObject;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import com.example.wanbaqian.bean.PageInfo;

/**
 * 利用Gson发射对象类型，将json转化为对象
 */
public class JsonUtils {
    private Gson mGson = null;
    private static JsonUtils mUtils;

    static {
        mUtils = new JsonUtils();
    }

    public static JsonUtils getInstance() {
        if (mUtils == null) {
            return new JsonUtils();
        } else {
            return mUtils;
        }
    }


    /**
     * 将json数组转化为对应实体
     * <p>
     * <p>
     * json字符串
     * <p>
     * 对应实体类型
     *
     * @return 实体列表
     */
    public <T> T jsonToObject(String jsonString, Class<T> cls) {
        T t = null;
        jsonString = jsonString.replace("[", "");
        jsonString = jsonString.replace("]", "");
        System.out.println(jsonString);
        try {
            if (mGson == null) {
                mGson = new GsonBuilder().serializeNulls().create();
            }
            t = mGson.fromJson(jsonString, cls);
        } catch (Exception e) {
            // TODO: handle exception
            System.err.println("报错信息" + e.getMessage());
        }
        return t;
    }

    /**
     * 将json对象转化为对应实体
     * <p>
     * <p>
     * json字符串
     * <p>
     * 对应实体类型
     *
     * @return 实体列表
     */
    public <T> T jsonToObjectk(String jsonString, Class<T> cls) {
        T t = null;

        try {
            if (mGson == null) {
                mGson = new GsonBuilder().serializeNulls().create();
            }
            t = mGson.fromJson(jsonString, cls);
        } catch (Exception e) {
            // TODO: handle exception
        }
        return t;
    }

    /**
     * 将json数组转化为List
     *
     * @param json     json字符串
     * @param classOfT 对应实体类型
     * @return 实体列表
     */
    public <T> ArrayList<T> jsonToList(String json, Class<T> classOfT) {
        try {
            if (mGson == null) {
                // 不要直接new Gson是为了避免放回结果为null的这种情况
                mGson = new GsonBuilder().serializeNulls().create();
            }
            Type type = new TypeToken<ArrayList<JsonObject>>() {
            }.getType();
            ArrayList<JsonObject> jsonObjs = mGson.fromJson(json, type);

            ArrayList<T> listOfT = new ArrayList<T>();
            for (JsonObject jsonObj : jsonObjs) {
                listOfT.add(mGson.fromJson(jsonObj, classOfT));
            }
            return listOfT;
        } catch (Exception e) {
            // TODO: handle exception
            //LogUtils.d("json格式有误！");
            return null;
        }
    }

    public String getJsonObject(String json, String key) {
        try {
            JSONObject object = new JSONObject(json);
            return object.getString(key);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * @param json
     * @param key
     * @return
     */
    public int getInt(String json, String key) {
        try {
            JSONObject object = new JSONObject(json);
            return object.getInt(key);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return 0;
    }

    /**
     * 得到response数据
     *
     * @param json
     */
    public String getResponse(String json) {
        return getJsonObject(json, "response");
    }

    /**
     * 得到Info数据
     *
     * @param json
     */
    public String getInfo(String json) {
        return getJsonObject(getResponse(json), "info");
    }

    /**
     * 得到content数据
     *
     * @param json
     */
    public String getContent(String json) {
        return getJsonObject(getResponse(json), "content");
    }


    /**
     * 得到message_list数据
     *
     * @param json
     */
    public String getMessageList(String json) {
        return getJsonObject(json, "message_list");
    }

    /**
     * 得到补充材料详情状态数据
     *
     * @param json
     */
    public String[] getInfoStat(String json, String... keys) {
        String[] stats = new String[keys.length];
        for (int i = 0; i < keys.length; i++) {
            stats[i] = getInt(json, keys[i])==0 ? "未完善" : "已完善";
        }
        return stats;
    }

    public <T> ArrayList<T> getList(String json, String title, Class<T> classOfT) {
        return jsonToList(getJsonObject(json, title), classOfT);
    }

    /**
     * 是否有下一页数据
     *
     * @param content
     * @return
     */
    public boolean havePage(String content) {
        PageInfo info = jsonToObjectk(getJsonObject(content, "page_info"), PageInfo.class);
        return Integer.parseInt(info.getTotal_count()) > Integer.parseInt(info.getCurrent_page()) * Integer.parseInt(info.getPage_size());
    }
}
